#include<bits/stdc++.h>
using namespace std;
#define int long long

struct cheese {
	double x, y;
} a[20];

int n;
double ans = INT_MAX;
bool vis[20];

inline void dfs(int k, double now_distance, double pre_x, double pre_y) {
	if (now_distance > ans)	return ;

	if (k == n) {
		ans = min(ans, now_distance);
		return ;
	}

	for (int i = 1; i <= n; i++) {
		if (vis[i])	continue;

		double tmp = now_distance + sqrt((a[i].x - pre_x) * (a[i].x - pre_x) + (a[i].y - pre_y) * (a[i].y - pre_y));

		if (tmp > ans)	return ;

		vis[i] = 1;
		dfs(k + 1, tmp, a[i].x, a[i].y);
		vis[i] = 0;
	}
}

//inline double RANDOM() {
//	random_device sd;
//	mt19937 mt(sd());
//	uniform_int_distribution<int> dis(1, n);
//
//	int origin = dis(mt);
//
//	int cnt = 1;
//	double pre_x = a[origin].x, pre_y = a[origin].y;
//	double ans = sqrt(pre_x * pre_x + pre_y * pre_y);
//
//	vector<bool> vis(n + 1);
//	vis[origin] = 1;
//
//	while (cnt < n) {
//		origin = dis(mt);
//		if (vis[origin])	continue;
//		vis[origin] = 1;
//		cnt++;
//		ans += sqrt((pre_x - a[origin].x) * (pre_x - a[origin].x) + (pre_y - a[origin].y) * (pre_y - a[origin].y));
//		pre_x = a[origin].x;
//		pre_y = a[origin].y;
//	}
//	return ans;
//}

//double SA() {
//	double K = 0.9998, T = 1000;
//
//	double best_ans = RANDOM();
//
//	while (T > 0.01) {
//		T *= K;
//
//		double tmp = RANDOM();
//
//		best_ans = min(tmp, best_ans);
//		cout << best_ans << endl;
//	}
//	return best_ans;
//}

signed main() {
	freopen("D:\\code\\OJ code\\LuoGu\\P1433_10.in", "r", stdin);

	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i].x >> a[i].y;

	if (n < 15) {
		dfs(0, 0, 0, 0);
		cout << fixed << setprecision(2) << ans;
	} else
		cout << fixed << setprecision(2) << SA();
	return 0;
}
